<?php
namespace helper;
class Safe {
    public static function data($data,$type='html'){
        if(is_array($data)){
            foreach($data as $key=>$val){
                $data[$key]=self::data($val,$type);
            }
        }else{
            $data=self::html($data,$type);
        }
        return $data;
    }
    public static function html($text,$type='html'){
        // 无标签格式
        $text_tags='';
        // 只保留链接
        $link_tags='<a>';
        // 只保留图片
        $image_tags='<img>';
        // 只存在字体样式
        $font_tags='<i><b><u><s><em><strong><font><big><small><sup><sub><bdo><h1><h2><h3><h4><h5><h6>';
        // 标题摘要基本格式
        $base_tags=$font_tags.'<p><br><hr><a><img><map><area><pre><code><q><blockquote><acronym><cite><ins><del><center><strike><section><header><footer><article><nav><audio><video>';
        // 兼容Form格式
        $form_tags=$base_tags.'<form><input><textarea><button><select><optgroup><option><label><fieldset><legend>';
        // 内容等允许HTML的格式
        $html_tags=$base_tags.'<meta><ul><ol><li><dl><dd><dt><table><caption><td><th><tr><thead><tbody><tfoot><col><colgroup><div><span><object><embed><param>';
        // 全HTML格式
        $all_tags=$form_tags.$html_tags.'<!DOCTYPE><html><head><title><body><base><basefont><script><noscript><applet><object><param><style><frame><frameset><noframes><iframe>';
        // 过滤标签
        //pre标签内的代码也会被转义 $text=html_entity_decode($text,ENT_NOQUOTES,$charset);
        if($type=='text'){
            $typetags=$text_tags;
        }elseif($type=='link'){
            $typetags=$link_tags;
        }elseif($type=='image'){
            $typetags=$image_tags;
        }elseif($type=='font'){
            $typetags=$font_tags;
        }elseif($type=='base'){
            $typetags=$base_tags;
        }elseif($type=='form'){
            $typetags=$form_tags;
        }elseif($type=='html'){
            $typetags=$html_tags;
        }elseif($type=='all'){
            $typetags=$all_tags;
        }
        $text=strip_tags($text,$typetags);
        
        // 过滤攻击代码
        if($type !='all'){
            // 过滤危险的属性，如：过滤on事件lang js
            while(preg_match('/(<[^><]+)(ondblclick|onclick|onload|onerror|unload|onmouseover|onmouseup|onmouseout|onmousedown|onkeydown|onkeypress|onkeyup|onblur|onchange|onfocus|codebase|dynsrc|lowsrc)([^><]*)/i',$text,$mat)){
                $text=str_ireplace($mat[0],$mat[1].$mat[3],$text);
            }
            while(preg_match('/(<[^><]+)(window\.|javascript:|js:|about:|file:|document\.|vbs:|cookie)([^><]*)/i',$text,$mat)){
                $text=str_ireplace($mat[0],$mat[1].$mat[3],$text);
            }
        }
        return $text;
    }
}
?>